package com.javacv.plus.platform;

import lombok.Builder;
import lombok.Data;

/**
 * 系统信息
 */
@Data
@Builder
public class SystemInfo {

    /**
     * 操作系统名称
     */
    private String osName;

    /**
     * 操作系统版本
     */
    private String osVersion;

    /**
     * 操作系统架构
     */
    private String osArch;

    /**
     * Java版本
     */
    private String javaVersion;

    /**
     * Java厂商
     */
    private String javaVendor;

    /**
     * 可用处理器数量
     */
    private int availableProcessors;

    /**
     * 最大内存（字节）
     */
    private long maxMemory;

    /**
     * 总内存（字节）
     */
    private long totalMemory;

    /**
     * 空闲内存（字节）
     */
    private long freeMemory;

    /**
     * 平台信息
     */
    private Platform platform;

    /**
     * 获取已使用内存（字节）
     */
    public long getUsedMemory() {
        return totalMemory - freeMemory;
    }

    /**
     * 获取内存使用率（百分比）
     */
    public double getMemoryUsagePercentage() {
        return (double) getUsedMemory() / totalMemory * 100;
    }

    /**
     * 获取最大内存使用率（百分比）
     */
    public double getMaxMemoryUsagePercentage() {
        return (double) getUsedMemory() / maxMemory * 100;
    }

    /**
     * 格式化内存大小
     */
    public static String formatMemorySize(long bytes) {
        if (bytes < 1024) {
            return bytes + " B";
        } else if (bytes < 1024 * 1024) {
            return String.format("%.2f KB", bytes / 1024.0);
        } else if (bytes < 1024 * 1024 * 1024) {
            return String.format("%.2f MB", bytes / (1024.0 * 1024));
        } else {
            return String.format("%.2f GB", bytes / (1024.0 * 1024 * 1024));
        }
    }

    /**
     * 获取格式化的内存信息
     */
    public String getFormattedMemoryInfo() {
        return String.format("已用: %s / 总计: %s / 最大: %s (使用率: %.1f%%)",
                formatMemorySize(getUsedMemory()),
                formatMemorySize(totalMemory),
                formatMemorySize(maxMemory),
                getMemoryUsagePercentage());
    }

    @Override
    public String toString() {
        return String.format(
                "SystemInfo{\n" +
                "  操作系统: %s %s (%s)\n" +
                "  Java: %s (%s)\n" +
                "  平台: %s\n" +
                "  处理器: %d 核\n" +
                "  内存: %s\n" +
                "}",
                osName, osVersion, osArch,
                javaVersion, javaVendor,
                platform,
                availableProcessors,
                getFormattedMemoryInfo());
    }
} 